package com.example.hctorisrael.deadolympics;

import org.andengine.engine.Engine;
import org.andengine.engine.camera.hud.HUD;
import org.andengine.entity.primitive.Rectangle;
import org.andengine.entity.text.Text;
import org.andengine.opengl.font.Font;
import org.andengine.opengl.font.FontFactory;
import org.andengine.opengl.texture.ITexture;
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;
import org.andengine.util.adt.align.HorizontalAlign;

/**
 * Created by Irving on 4/24/15.
 */
public class Marcador extends HUD{
    private Engine engine;
    private ControlJuego actividad;

    // Puntos que acumula cada vez que pasa un obstáculo
    private int marcador;
    private Text txtMarcador;
    // Oportunidades que tiene para mantenerse en el juego
    private int vidas;      // inicialmente 3
    private Text txtVidas;
    private final int VIDAS_INICIALES = 3;
    private Rectangle cuadroVidas;  // Marco del letrero vidas
    private Rectangle cuadro;


    // Marcador más alto
    private Rectangle cuadroMasAlto;
    private Text txtMarcadorMasAlto;
    private int marcadorMasAlto;

    //Segundo Marcador mas Alto
    private Rectangle cuadroMasAltoDos;
    private Text txtMarcadorMasAltoDos;
    private int marcadorMasAltoDos;



    public Marcador(Engine engine, ControlJuego actividad) {
        this.engine = engine;
        marcador = 0;
        vidas = VIDAS_INICIALES;
        this.actividad = actividad;

        agregarMarcador();
        agregarVidas();
        agregarMarcadorMasAlto();
        agregarMarcadorMasAltoDos();
    }

    public void quitarVidas(){
        cuadroVidas.setVisible(false);
        return;
    }

    public void quitarMarcador(){
        cuadro.setVisible(false);
        return;
    }

    public void quitarMarcadorMasAlto(){
        cuadroMasAlto.setVisible(false);
    }

    public void quitarMarcadorMasAltoDos(){
        cuadroMasAltoDos.setVisible(false);
    }

    public void moverMarcadorMasAlto(int x, int y){
        cuadroMasAlto.setPosition(x, y);
    }

    public void moverMarcadorMasAltoDos(int x, int y){
        cuadroMasAltoDos.setPosition(x, y);
    }

    public void moverVidas(int x, int y){
        cuadroVidas.setPosition(x, y);
    }

    public void moverMarcador(int x, int y){
        cuadro.setPosition(x,y);
    }


    // Para el marcador mayor
    public void agregarMarcadorMasAlto() {
        // Un cuadro transparente arriba centrado
         cuadroMasAlto = new Rectangle(ControlJuego.ANCHO_CAMARA/8,ControlJuego.ALTO_CAMARA-60,
                200,100, engine.getVertexBufferObjectManager());
        cuadroMasAlto.setColor(0f, 0f, 0f, 0f);
        this.attachChild(cuadroMasAlto);

        // Letrero sobre el cuadro
        Font tipo = crearTipoLetra();
        txtMarcadorMasAlto = new Text(100,50,
                tipo,"First: 0",15,engine.getVertexBufferObjectManager());
        txtMarcadorMasAlto.setWidth(200);
        txtMarcadorMasAlto.setHorizontalAlign(HorizontalAlign.CENTER);


        // Agrega el marcador al recuadro trasparente
        cuadroMasAlto.attachChild(txtMarcadorMasAlto);
    }

    // Para el segundo marcador mayor
    public void agregarMarcadorMasAltoDos() {
        // Un cuadro transparente arriba centrado
        cuadroMasAltoDos = new Rectangle(60,ControlJuego.ALTO_CAMARA/2,
                200,100, engine.getVertexBufferObjectManager());
        cuadroMasAltoDos.setColor(0f, 0f, 0f, 0f);
        this.attachChild(cuadroMasAltoDos);

        // Letrero sobre el cuadro
        Font tipo = crearTipoLetra();
        txtMarcadorMasAltoDos = new Text(100,50,
                tipo,"Second: 0",15,engine.getVertexBufferObjectManager());
        txtMarcadorMasAltoDos.setWidth(200);
        txtMarcadorMasAltoDos.setHorizontalAlign(HorizontalAlign.CENTER);
        // Agrega el marcador al recuadro trasparente
        cuadroMasAltoDos.attachChild(txtMarcadorMasAltoDos);
    }



    // Agrega un cuadro para las vidas en el HUD del juego.
    public void agregarVidas() {
        // Un cuadro transparente arriba centrado
        cuadroVidas = new Rectangle(ControlJuego.ANCHO_CAMARA/2,ControlJuego.ALTO_CAMARA-60,
                200,100, engine.getVertexBufferObjectManager());
        cuadroVidas.setColor(0, 0f, 0, 0f);
        this.attachChild(cuadroVidas);

        // Letrero sobre el cuadro
        Font tipo = crearTipoLetra();
        txtVidas = new Text(100,50,
                tipo,"Lives: " + vidas,15,engine.getVertexBufferObjectManager());
        txtVidas.setWidth(200);
        txtVidas.setHorizontalAlign(HorizontalAlign.CENTER);

        // Agrega el marcador al recuadro trasparente
        cuadroVidas.attachChild(txtVidas);
    }

    // Arma el HUD del juego.
    public void agregarMarcador() {
        // Un cuadro negro transparente arriba a la derecha
         cuadro = new Rectangle(ControlJuego.ANCHO_CAMARA-160,ControlJuego.ALTO_CAMARA-60,
                250,100, engine.getVertexBufferObjectManager());
        cuadro.setColor(0,0,0,0);
        this.attachChild(cuadro);

        // Letrero sobre el cuadro
        Font tipo = crearTipoLetra();
        txtMarcador = new Text(125,50,
                tipo,"Points: " + marcador,15,engine.getVertexBufferObjectManager());
        txtMarcador.setWidth(150);
        txtMarcador.setHorizontalAlign(HorizontalAlign.CENTER);

        // Agrega el marcador al recuadro trasparente
        cuadro.attachChild(txtMarcador);
    }

    // Crea y regresa un font que carga desde un archivo .ttf  (http://www.1001freefonts.com, http://www.1001fonts.com/)
    private Font crearTipoLetra() {

        // La imagen que contiene cada símbolo
        final ITexture fontTexture = new BitmapTextureAtlas(engine.getTextureManager(),1024,1024);

        // Carga el archivo, tamaño 36, antialias y color
        Font tipoLetra = FontFactory.createFromAsset(engine.getFontManager(),
                fontTexture,actividad.getAssets(),"bad.ttf",36,true, 0xFFFFFFFF);
        tipoLetra.load();
        tipoLetra.prepareLetters("Points: 0123456789".toCharArray());

        return tipoLetra;
    }

    // Método para actualizar el marcador
    public void aumentarMarcador(int delta) {
        marcador += delta;
        // Actualiza en el HUD
        txtMarcador.setText("Points: " + marcador);

        // ¿Supera el marcador anterior?
        if (marcador>marcadorMasAlto) {
            setMarcadorMasAlto(marcador);
        }

        if(marcador>marcadorMasAltoDos && marcador<marcadorMasAlto){
            setMarcadorMasAltoDos(marcador);
        }
    }

    // Quita vidas
    public void disminuirVidas(int delta) {
        vidas -= delta;
        // Actualiza el HUD
        txtVidas.setText("Lives: " + vidas);

    }

    // Método accesor
    public int getMarcador() {
        return marcador;
    }

    // Método modificador
    public void setMarcador(int marcador) {

        this.marcador = marcador;
        txtMarcador.setText("Points: " + marcador);
    }

    public int getVidas() {
        return vidas;
    }

    public void setVidas(int vidas) {
        this.vidas = vidas;
        txtVidas.setText("Lives: " + vidas);
    }

    public int getMarcadorMasAlto() {
        return marcadorMasAlto;
    }
    public int getMarcadorMasAltoDos(){return marcadorMasAltoDos;}

    // Muestra el nuevo marcador más alto
    public void setMarcadorMasAlto(int ultimoMarcador) {
        marcadorMasAlto = ultimoMarcador;
        // Mostrar el marcador más alto
        txtMarcadorMasAlto.setText("First: " + ultimoMarcador);
    }

    public void setMarcadorMasAltoDos(int ultimoMarcador) {
        marcadorMasAltoDos = ultimoMarcador;
        // Mostrar el marcador más alto
        txtMarcadorMasAltoDos.setText("Second: " + ultimoMarcador);
    }



}
